home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / archiver / zoo21src.zoo / zoofilt.c < prev    next >
C/C++ Source or Header  |  1991-07-24  |  2KB  |  87 lines

  1. /* derived from: zoofilt.c 1.8 88/01/30 23:47:05 */
  2.  
  3. #ifndef LINT
  4. static char sccsid[]="@(#) $Id: zoofilt.c,v 1.2 1991/07/24 23:58:04 bjsjr Rel $";
  5. #endif
  6.  
  7. /*
  8. (C) Copyright 1988 Rahul Dhesi -- All rights reserved
  9. (C) Copyright 1991 Rahul Dhesi -- All rights reserved
  10.  
  11. Filter mode -- compress or decompress standard input and write
  12. to standard output.
  13. */
  14.  
  15. #include "options.h"
  16.  
  17. #ifdef FILTER
  18.  
  19. #include "zooio.h"
  20. #include "errors.i"
  21. #include "zoofns.h"
  22.  
  23. /* action */
  24. #define COMPRESS        0
  25. #define UNCOMPRESS    1
  26.  
  27. #define FTAG    ((unsigned int) 0x5a32)    /* magic number */
  28.  
  29. extern unsigned int crccode;
  30.  
  31. int rdint PARMS((unsigned int *));    /* read an unsigned int */
  32. int wrint PARMS((unsigned int));    /* write an unsigned int */
  33.  
  34. /* global variable used to pass two bytes (CRC value) back from lzd to here */
  35. unsigned int filt_lzd_word;
  36.  
  37. void zoofilt (option)
  38. char *option;
  39. {
  40.     int choice;                                            /* what to do -- [de]compress */
  41.     unsigned int filetag;                            /* tag stored in input */
  42.     int stat1, stat2, stat3;                        /* status codes */
  43.     int use_lzh = 0;                                    /* use lzh instead */
  44.     extern lzc(), lzh_encode();                    /* possible encoders */
  45.     extern lzd(), lzh_decode();                    /* and decoders */
  46.  
  47.     while (*++option) {
  48.         switch (*option) {
  49.             case 'c':    choice = COMPRESS;    break;
  50.             case 'u':    choice = UNCOMPRESS;  break;
  51.             case 'h':    use_lzh = 1; break;
  52.             default:
  53.              prterror ('f', inv_option, *option);    /* fatal error -- abort */
  54.       }
  55.     }
  56.  
  57.     crccode = 0;    /* needed whether compressing or uncompressing */
  58.  
  59.     switch (choice) {
  60.         case COMPRESS:
  61.             stat1 = wrint (FTAG);
  62.             stat2 = (use_lzh ? lzh_encode : lzc) (STDIN, STDOUT);
  63.             stat3 = wrint (crccode);
  64.             if (stat1 == 0 && stat2 == 0 && stat3 == 0)
  65.                 zooexit (0);
  66.             else {
  67.                 fprintf (stderr, "Zoo: FATAL: Compression error.\n");
  68.                 zooexit (1);
  69.             }
  70.             break;
  71.         case UNCOMPRESS:
  72.             stat1 = rdint (&filetag);
  73.             if (stat1 != 0 || filetag != FTAG)
  74.                 zooexit (1);
  75.             stat2 = (use_lzh ? lzh_decode : lzd) (STDIN, STDOUT);
  76.             if (stat2 == 0 && filt_lzd_word == crccode)
  77.                 zooexit (0);
  78.             else {
  79.                 fprintf (stderr, "Zoo: FATAL: Uncompression error.\n");
  80.                 zooexit (1);
  81.             }
  82.             break;
  83.     }
  84. } /* zoofilt */
  85.  
  86. #endif /* FILTER */
  87.